绘制矩阵图
数据集
|
|
计算相关矩阵
|
|
绘图
|
|
绘制相关矩阵,例如颜色广场和黑色文本标签,并且上边的文本标签呈现45度,如下所示:
|
|
更改颜色
现在更改一下相关矩阵的颜色,如下所示:
|
|
绘制函数曲线
绘制正态分布曲线
使用stat_function()
函数,为了得到合适的x的范围,必须给ggplot()函数传递一个“哑”数据库,如下所示:
|
|
绘制t分布曲线
|
|
额外的参数使用list()进行传递,传递给args。
绘制自定义的函数
第一个参数必须是x轴的值,并且必须返回y值,在这个案例中,我们绘制一个S型函数,如下所示:
|
|
计算函数值是使用给出的x范围内的101个点,如果函数跳跃很大,画出来的图可能有一些支离破碎的线段,为了让曲线更加光滑,可以给stat_function()
传递一个更大的n,例如stat_function(fun=myfun,n=200)
。
在函数曲线下添加阴影
根据你的曲线函数定义了一个新的函数,把x范围外对应的值替换为NA,操作如下所示:
|
|
需要注意的是,给这个函数传入的是一个向量,而不是一个单独的值,如果这个函数每次只操作一个元素,那么使用一个if/else语句来根据x值确定返回值是更合理,但是那样做在这里却行不通,因为x是一个含有许多值的向量。
R中有第一类函数,我们可以写一个函数来返回一个闭包,也就是说, 我们可以编写一个能够编写函数的函数,这个函数允许你传递一个函数、一个最小值,一个最大值,定义域外对应的值域返回NA,如下所示:
|
|
现在我们可以调用这个函数来生成另外一个函数,这和之前使用的dnorm_list()
函数的效果是一样,如下所示:
|
|
结果如下所示:
|
|
现在使用limitRange()
来生成函数,并传递给stat_function()
,
|
|
limitRange()
函数可以用来生成任何函数的“区间限制式”函数,不局限于dnorm()
。从上图中,我们哦可以知道,阴影区域并没有和我们给出的边界值范围完全齐,这是因为ggplot2在固定区间上计算函数值时做了个数值近似,并且这些区间没有完全落在指定的范围上,但我们可以通过设置stat_function(n=200)
以增加插点数量的方式来提升近似的效果。
绘制网络图
网络图要使用igrpha
包,如下所示:
绘制一个有向图的边:
|
|
绘制一个无向图,没有标签,如下所示:
|
|
在网络图中,节点的位置并不是由所给数据确定的,它们是随机放置的,如果要让得到的图更可读,可以在绘图之前设置随机数种子,比如,可以浓度不同的随机数种子,直到得到一个比较满意的结果:
|
|
我们还可以采用Fruchterman-Reingold布局算法,该算法的主要思想是所有节点之间都有电磁斥力,但是连接节点的边像弹簧一样,会把相应的节点拉在一起。
也哦可以从数据框中直接生图,使用数据框的前两列,并且每一列确定两个节点相连,如下所示:
|
|
也可以从数据框生成无向图,madmen数据集中一行就可以表示一条边,因为对于无向图来说,方向是没有意义的,现在我们使用圆圈布局,如下所示:
|
|
igraph的一个替代选择是Rgraphviz
,该包是Graphviz
的前端,它的优点是能更方便地处理标签,而且也更容易控布局,由Bioconductor系统库维护,常用于绘制KEGG图。
在网络图中使用文本标签
边和节点可能都有名字,但默认时这些名字可能没有被当作标签,为了设置标签,可以给vertex.label
参数传递一个命名向量,如下所示:
|
|
绘图:
|
|
另一种能得到相同效果的方法是修改绘图对象,这样就不用给plot()
函数传递对数了,此时,可以使用V()$xxx <-
来代替vertex.xxx
参数传递值,例如下面的代码可以得到和前面一样的输出:
|
|
设置边的属性
使用E()
函数或者给edge.xxx
参数传递相应值,如下所示:
|
|
热图
使用geom_tile()
或者geom_raster()
,并将一个连续变量映射到fill
上,使用Presidents
数据集,如下所示:
|
|
这是一个时间序列格式,首选将它转换为ggplot()
可用的数据框格式,如下所示:
|
|
现在使用geom_tile()
或geom_raster()
来绘制,如下所示:
|
|
或者使用geom_raster()
,如下所示:
|
|
上图中的灰色区域是缺失值。
为了更有效地表达信息,可以自定义热图的外观,现在我们倒转y轴,这样顺序就是从上到下了,并且在x轴上每隔4年添加一个坐标刻度值来表示一个总统任期,此外,再更换颜色标度,使用scale_fill_gradient2()
调色板,该调色板可以设置一个中点和两个端点的色彩值,如下所示:
|
|